// import com.alibaba.druid.sql.ast.*;

// import java.util.std::list;
#pragma once

#include <string>
#include <list>

#include "../SQLObject.h"
#include "../SQLExpr.h"
#include "../SQLHint.h"
#include "../SQLName.h"

// #include "SQLColumnDefinition.h"

class SQLTableSource : virtual public SQLObject
{
public:
  // static string_ptr class_;
  GETCALSS(SQLTableSource);
  virtual string_ptr getAlias() = 0;

  virtual long aliasHashCode64() = 0;

  virtual void setAlias(string_ptr alias) = 0;

  virtual SQLHint_list_ptr getHints() = 0;

  // virtual SQLTableSource_ptr  clone() = 0;
  virtual SQLObject_ptr clone() = 0;
  virtual string_ptr computeAlias() = 0;

  virtual BOOL_ptr containsAlias(string_ptr alias) = 0;

  virtual SQLExpr_ptr getFlashback() = 0;

  virtual void setFlashback(SQLExpr_ptr flashback) = 0;

  virtual SQLColumnDefinition_ptr findColumn(string_ptr  columnName) = 0;
  virtual SQLColumnDefinition_ptr findColumn(long columnNameHash) = 0;
  virtual SQLObject_ptr resolveColum(long columnNameHash) = 0;

  virtual SQLTableSource_ptr findTableSourceWithColumn(string_ptr columnName) = 0;
  virtual SQLTableSource_ptr findTableSourceWithColumn(long columnName_hash) = 0;
  virtual SQLTableSource_ptr findTableSourceWithColumn(SQLName_ptr columnName) = 0;
  virtual SQLTableSource_ptr findTableSourceWithColumn(long columnName_hash, string_ptr name, int option) = 0;
  virtual SQLTableSource_ptr findTableSource(string_ptr alias) = 0;
  virtual SQLTableSource_ptr findTableSource(long alias_hash) = 0;

  // SQLPivot* getPivot() = 0;

  virtual void setPivot(SQLPivot_ptr pivot) = 0;

  // SQLUnpivot* getUnpivot() = 0;

  virtual void setUnpivot(SQLUnpivot_ptr x) = 0;
};
